const Babl *format;/* the pixel format the palette is stored in */
void *data; /* one linear segment of all the pixels representing the palette, in order */
void *data_double;
+ void *data_u8;
} BablPalette;
pal->format = format;
pal->data = malloc (bpp * count);
pal->data_double = malloc (4 * sizeof(double) * count);
+ pal->data_u8 = malloc (4 * sizeof(char) * count);
memcpy (pal->data, data, bpp * count);
babl_process (babl_fish (format, babl_format ("RGBA double")),
pal->data, pal->data_double, count);
{
free (pal->data);
free (pal->data_double);
+ free (pal->data_u8);
free (pal);
}
*/
pal.data = defpal_data;
pal.data_double = defpal_double;
+ pal.data_u8 = defpal_data;
+
babl_process (babl_fish (pal.format, babl_format ("RGBA double")),
pal.data, pal.data_double, pal.count);
return &pal;
return n;
}
+static long
+pal_u8_to_rgba_u8 (char *src,
+ char *dst,
+ long n,
+ void *src_model_data,
+ void *foo)
+{
+ BablPalette *pal = src_model_data;
+ while (n--)
+ {
+ int idx = (((unsigned char *) src)[0]);
+ unsigned char *palpx;
+
+ if (idx < 0) idx = 0;
+ if (idx >= pal->count) idx = pal->count-1;
+
+ palpx = ((unsigned char*)pal->data_u8) + idx * 4;
+ memcpy (dst, palpx, sizeof(char)*4);
+
+ src += sizeof (char) * 1;
+ dst += sizeof (char) * 4;
+ }
+ return n;
+}
static long
pala_to_rgba (char *src,
sprintf (cname, "_babl-int-%i", cnt++);
name = cname;
}
+ else
+ {
+ strcpy (cname, name);
+ name = cname;
+ }
/* re-registering is a no-op */
babl_component_new (
"alpha",
NULL);
-
if (with_alpha)
{
model = babl_model_new ("name", name,
"linear", rgba_to_pal,
NULL
);
+
format = babl_format_new ("name", name, model,
babl_type ("u8"),
babl_component ("I"), NULL);
+
+ babl_conversion_new (
+ format,
+ babl_format ("RGBA u8"),
+ "linear", pal_u8_to_rgba_u8,
+ NULL);
}
babl_set_user_data (format, default_palette ());